package org.mongodb.morphia;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBObject;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Test;
import org.mongodb.morphia.annotations.Embedded;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Field;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Index;
import org.mongodb.morphia.annotations.Indexed;
import org.mongodb.morphia.annotations.Indexes;
import org.mongodb.morphia.annotations.Property;
import java.util.Iterator;
import java.util.List;
import static org.mongodb.morphia.utils.IndexType.DESC;
public class TestIndexCollections extends TestBase {
@Test
public void testEmbedded() {
AdvancedDatastore ads = getAds();
DB db = getDb();
getMorphia().map(HasEmbeddedIndex.class);
ads.ensureIndexes();
ads.ensureIndexes("b_2", HasEmbeddedIndex.class);
BasicDBObject[] indexes = new BasicDBObject[]{
new BasicDBObject("name", 1),
new BasicDBObject("embeddedIndex.color", -1),
new BasicDBObject("embeddedIndex.name", 1),
};
testIndex(db.getCollection("b_2").getIndexInfo(), indexes);
testIndex(ads.getCollection(HasEmbeddedIndex.class).getIndexInfo(), indexes);
}
@Test
public void testOldStyleIndexing() {
getMorphia().map(OldStyleIndexing.class);
getDb().dropDatabase();
getAds().ensureIndexes();
testIndex(getAds().getCollection(OldStyleIndexing.class).getIndexInfo(),
new BasicDBObject("field", 1),
new BasicDBObject("field2", -1),
new BasicDBObject("f3", 1));
}
@Test
@SuppressWarnings("deprecation")
public void testSingleFieldIndex() {
AdvancedDatastore ads = getAds();
DB db = getDb();
ads.ensureIndexes("a_1", SingleFieldIndex.class);
testIndex(db.getCollection("a_1").getIndexInfo(),
new BasicDBObject("field", 1),
new BasicDBObject("field2", -1),
new BasicDBObject("f3", 1));
ads.ensureIndex("a_2", SingleFieldIndex.class, "-field2");
ads.ensureIndexes("a_2", SingleFieldIndex.class);
testIndex(db.getCollection("a_2").getIndexInfo(),
new BasicDBObject("field", 1),
new BasicDBObject("field2", 1),
new BasicDBObject("field2", -1),
new BasicDBObject("f3", 1));
ads.ensureIndex("a_3", SingleFieldIndex.class, "field, field2");
testIndex(db.getCollection("a_3").getIndexInfo(), new BasicDBObject("field", 1)
.append("field2", 1));
}
private void testIndex(final List<DBObject> indexInfo, final BasicDBObject... indexes) {
Iterator<DBObject> iterator = indexInfo.iterator();
while (iterator.hasNext()) {
final DBObject dbObject = iterator.next();
if (dbObject.get("name").equals("_id_")) {
iterator.remove();
} else {
for (final DBObject index : indexes) {
final DBObject key = (DBObject) dbObject.get("key");
if (key.equals(index)) {
iterator.remove();
}
}
}
}
Assert.assertTrue("Should have found all the indexes. Remaining: " + indexInfo, indexInfo.isEmpty());
}
@Entity
@Indexes({@Index(fields = @Field(value = "field2", type = DESC)), @Index(fields = @Field("field3"))})
private static class SingleFieldIndex {
@Id
private ObjectId id;
@Indexed
private String field;
@Property
private String field2;
@Property("f3")
private String field3;
}
@Entity
@Indexes({@Index(fields = @Field(value = "field2", type = DESC)), @Index(fields = @Field("field3"))})
private static class OldStyleIndexing {
@Id
private ObjectId id;
@Indexed
private String field;
@Property
private String field2;
@Property("f3")
private String field3;
}
@Entity
private static class HasEmbeddedIndex {
@Id
private ObjectId id;
@Indexed
private String name;
@Embedded
private EmbeddedIndex embeddedIndex;
}
@Embedded
@Indexes(@Index(fields = @Field(value = "color", type = DESC)))
private static class EmbeddedIndex {
@Indexed
private String name;
private String color;
}
}